package com.jmcgg.freesky.common.dao;

import java.io.Serializable;
import java.util.List;

/**
 * An interface shared by all business data access objects.
 * <p>
 * All CRUD (create, read, update, delete) basic data access operations are
 * isolated in this interface and shared across all DAO implementations. The
 * current design is for a state-management oriented persistence layer (for
 * example, there is no UDPATE statement function) that provides automatic
 * transactional dirty checking of business objects in persistent state.
 * 
 * @author Christian Bauer
 */
public interface GenericDAO<T, ID extends Serializable> {

	/**
	 * Affects every managed instance in the current persistence context!
	 */
	void clear();

	void delete(T entity);

	List<T> findAll();

	List<T> findByExample(T exampleInstance, String... excludeProperty);

	T findById(ID id);

	T findById(ID id, boolean lock);

	/**
	 * Affects every managed instance in the current persistence context!
	 */
	void flush();

	T save(T entity);

	void saveOrUpdate(T entity);
}
